package utils;

import constant.Constant;
import entry.P;
import entry.Page;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class QiMaDingUtil_beifen {
    public static void main(String[] args) {
//        List<List<P>> lists = getLists(32, 2, 4, 4, Constant.yin_shua_fang_shi_zheng_fan);


    }



    public static List<List<P>> getLists(int page, int lian, int col, int row, String ysfs) {
        int r = row / lian;
        String zheye = Constant.zhe_ye_shi_zi_zhe;
        if (col == 4 && row == 4 && lian > 1) {
            zheye = Constant.zhe_ye_dui_zhe;
        }
        if(Constant.hengban){
            if(zheye==Constant.zhe_ye_shi_zi_zhe){
                zheye = Constant.zhe_ye_dui_zhe;
            }else{
                zheye = Constant.zhe_ye_shi_zi_zhe;
            }
        }
        if (ysfs.equals("自翻")) {
            if (col == 2 && r == 2) {
                return zz22(page, lian);
            } else if ((page == 4 && row == 4 && col == 4)) {
                return zz22(page);
            } else if (page == 4 && row == 2 && col == 4) {
                return zz42();
            } else if (col == 4 && r == 2) {
                return zz42(page, lian, zheye);
            } else if (col == 4 && r == 4) {
                return zz44(page, lian);
            } else if (col == 4 && r == 3) {
                return zz43(page, lian);
            } else if (col == 4 && r == 1) {
                return zz41(page, lian);
            }
        } else {
            if (col == 2 && r == 3) {
                return zf23(page, lian);
            } else if (col == 4 && r == 2) {
                return zf42(page, lian, zheye);
            }  else if (col == 4 && r == 4) {
                return zf44(page, lian);
            } else if (col == 4 && r == 1) {
                return zf41(page, lian);
            } else if (col == 2 && r == 2) {
                return zf22(page, lian);
            } else if (col == 2 && r == 1) {
                return zf21(page, lian);
            }
        }
        return null;
    }

    private static List<List<P>> zf44(int page, int lian) {

        String[]arr = "9* 24* 17* 16* 8 25 32 1 5* 28* 29* 4* 12 21 20 13 15* 18* 23* 10* 2 31 26 7 3* 30* 27* 6* 14 19 22 11".split(" ");
        List<List<P>> lists = new ArrayList<>();

        List<P> listFont = new ArrayList<>();


        listFont.add(new P(9, 180));
        listFont.add(new P(24, 180));
        listFont.add(new P(17, 180));
        listFont.add(new P(16, 180));

        listFont.add(new P(8, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(3, 0));
        lists.add(listFont);

        return lists;
    }

    private static List<List<P>> zz42() {
        List<List<P>> lists = new ArrayList<>();

        List<P> listFont = new ArrayList<>();

        listFont.add(new P(4, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(3, 0));

        listFont.add(new P(4, 0));
        listFont.add(new P(1, 0));
        listFont.add(new P(2, 0));
        listFont.add(new P(3, 0));
        lists.add(listFont);

        return lists;
    }

    /**
     * 正反印2x3
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf23(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 6) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(page - i, 0));
                listFont.add(new P(1 + i, 0));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(page - i - 3, 180));
                listFont.add(new P(4 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(page - i - 4, 0));
                listFont.add(new P(5 + i, 0));
            }
            lists.add(listFont);
            List<P> listBack = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(i + 2, 0));
                listBack.add(new P(page - 1 - i, 0));
            }
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(i + 3, 180));
                listBack.add(new P(page - 2 - i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(i + 6, 0));
                listBack.add(new P(page - 5 - i, 0));
            }
            lists.add(listBack);
        }
        return lists;
    }

    /**
     * 正反印4x2
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf42(int page, int lian, String zheye) {
        List<List<P>> lists = new ArrayList<>();

        if (zheye.equals(Constant.zhe_ye_shi_zi_zhe)) {
            for (int i = 0; i < page / 2; i += 8) {
                List<P> listFont = new ArrayList<>();
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(page - i, 180));
                    listFont.add(new P(page - i - 3, 180));
                    listFont.add(new P(i + 4, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(8 + i, 0));
                    listFont.add(new P(page - i - 7, 0));
                    listFont.add(new P(page - i - 4, 0));
                    listFont.add(new P(i + 5, 0));
                }
                lists.add(listFont);
                List<P> listBack = new ArrayList<>();
                for (int k = 0; k < lian; k++) {
                    listBack.add(new P(3 + i, 180));
                    listBack.add(new P(page - i - 2, 180));
                    listBack.add(new P(page - i - 1, 180));
                    listBack.add(new P(i + 2, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listBack.add(new P(6 + i, 0));
                    listBack.add(new P(page - i - 5, 0));
                    listBack.add(new P(page - i - 6, 0));
                    listBack.add(new P(7 + i, 0));
                }
                lists.add(listBack);
            }
        } else if (zheye.equals(Constant.zhe_ye_dui_zhe)) {
            for (int i = 0; i < page / 2; i += 8) {
                List<P> listFont = new ArrayList<>();
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(page - i, 180));
                    listFont.add(new P(page - i - 7, 180));
                    listFont.add(new P(i + 8, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(4 + i, 0));
                    listFont.add(new P(page - i - 3, 0));
                    listFont.add(new P(page - i - 4, 0));
                    listFont.add(new P(i + 5, 0));
                }
                lists.add(listFont);
                List<P> listBack = new ArrayList<>();
                for (int k = 0; k < lian; k++) {
                    listBack.add(new P(7 + i, 180));
                    listBack.add(new P(page - i - 6, 180));
                    listBack.add(new P(page - i - 1, 180));
                    listBack.add(new P(i + 2, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listBack.add(new P(6 + i, 0));
                    listBack.add(new P(page - i - 5, 0));
                    listBack.add(new P(page - i - 2, 0));
                    listBack.add(new P(3 + i, 0));
                }
                lists.add(listBack);
            }
        }

        return lists;
    }

    /**
     * 正反印4x1
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf41(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 4) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(4 + i, 0));
                listFont.add(new P(page - i - 3, 0));
                listFont.add(new P(page - i, 0));
                listFont.add(new P(i + 1, 0));
            }

            lists.add(listFont);
            List<P> listBack = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(2 + i, 0));
                listBack.add(new P(page - i - 1, 0));
                listBack.add(new P(page - i - 2, 0));
                listBack.add(new P(i + 3, 0));
            }

            lists.add(listBack);
        }
        return lists;
    }

    /**
     * 自翻4x1
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz41(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 2) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(2 + i, 0));
                listFont.add(new P(page - i - 1, 0));
                listFont.add(new P(page - i, 0));
                listFont.add(new P(1 + i, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻4x3
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz43(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 6) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(2 + i, 0));
                listFont.add(new P(page - i - 1, 0));
                listFont.add(new P(page - i, 0));
                listFont.add(new P(1 + i, 0));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(3 + i, 180));
                listFont.add(new P(page - i - 2, 180));
                listFont.add(new P(page - i - 3, 180));
                listFont.add(new P(4 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(6 + i, 0));
                listFont.add(new P(page - i - 5, 0));
                listFont.add(new P(page - i - 4, 0));
                listFont.add(new P(i + 5, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻4x4
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz44(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 8) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(5 + i, 180));
                listFont.add(new P(page - i - 4, 180));
                listFont.add(new P(page - i - 7, 180));
                listFont.add(new P(8 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(4 + i, 0));
                listFont.add(new P(page - i - 3, 0));
                listFont.add(new P(page - i, 0));
                listFont.add(new P(i + 1, 0));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(3 + i, 180));
                listFont.add(new P(page - i - 2, 180));
                listFont.add(new P(page - i - 1, 180));
                listFont.add(new P(2 + i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(6 + i, 0));
                listFont.add(new P(page - i - 5, 0));
                listFont.add(new P(page - i - 6, 0));
                listFont.add(new P(i + 7, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻4x2
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz42(int page, int lian, String zheye) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 4) {
            List<P> listFont = new ArrayList<>();
            if (zheye.equals(Constant.zhe_ye_shi_zi_zhe)) {
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(page - i, 180));
                    listFont.add(new P(page - i - 1, 180));
                    listFont.add(new P(2 + i, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(4 + i, 0));
                    listFont.add(new P(page - i - 3, 0));
                    listFont.add(new P(page - i - 2, 0));
                    listFont.add(new P(3 + i, 0));
                }
            } else if (zheye.equals(Constant.zhe_ye_dui_zhe)) {
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(page - i, 180));
                    listFont.add(new P(page - i - 3, 180));
                    listFont.add(new P(4 + i, 180));
                }
                for (int k = 0; k < lian; k++) {
                    listFont.add(new P(2 + i, 0));
                    listFont.add(new P(page - i - 1, 0));
                    listFont.add(new P(page - i - 2, 0));
                    listFont.add(new P(3 + i, 0));
                }
            }

            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻2x2
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zz22(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 2) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(1 + i, 180));
                listFont.add(new P(page - i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(2 + i, 0));
                listFont.add(new P(page - i - 1, 0));
            }
            lists.add(listFont);
        }
        return lists;
    }

    /**
     * 自翻2x2
     *
     * @param page
     */
    public static List<List<P>> zz22(int page) {
        List<List<P>> lists = new ArrayList<>();
        if(Constant.hengban){
            for (int i = 0; i < page / 2; i += 2) {
                List<P> listFont = new ArrayList<>();
                for (int k = 0; k < 4; k++) {
                    listFont.add(new P(2 + i, 0));
                    listFont.add(new P(page - i - 1, 0));
                    listFont.add(new P(page - i, 0));
                    listFont.add(new P(1 + i, 0));

                }
                lists.add(listFont);
            }
        }else{
            for (int i = 0; i < page / 2; i += 2) {
                List<P> listFont = new ArrayList<>();
                for (int k = 0; k < 4; k++) {
                    listFont.add(new P(1 + i, 180));
                    listFont.add(new P(page - i, 180));
                }
                for (int k = 0; k < 4; k++) {
                    listFont.add(new P(2 + i, 0));
                    listFont.add(new P(page - i - 1, 0));
                }
                lists.add(listFont);
            }
        }

        return lists;
    }

    /**
     * 正反印2x2
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf22(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 4) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(1 + i, 180));
                listFont.add(new P(page - i, 180));
            }
            for (int k = 0; k < lian; k++) {
                listFont.add(new P(4 + i, 0));
                listFont.add(new P(page - i - 3, 0));
            }

            lists.add(listFont);
            List<P> listBack = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(page - i - 1, 180));
                listBack.add(new P(i + 2, 180));
            }
            for (int k = 0; k < lian; k++) {
                listBack.add(new P(page - i - 2, 0));
                listBack.add(new P(i + 3, 0));
            }
            lists.add(listBack);
        }
        return lists;
    }

    /**
     * 正反印2x1
     *
     * @param page
     * @param lian
     */
    public static List<List<P>> zf21(int page, int lian) {
        List<List<P>> lists = new ArrayList<>();
        for (int i = 0; i < page / 2; i += 2) {
            List<P> listFont = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                //第一页
                listFont.add(new P(page - i, 0));
                //第二页
                listFont.add(new P(1 + i, 0));
            }
            lists.add(listFont);
            List<P> listBack = new ArrayList<>();
            for (int k = 0; k < lian; k++) {
                //第三页
                listBack.add(new P(2 + i, 0));
                //第四页
                listBack.add(new P(page - 1 - i, 0));
            }
            lists.add(listBack);
        }
        return lists;
    }

    public static List<Page> getPages(int page, int cr) {
        int a, b, c, d, e;
        e = page;
        List<Integer> list1 = new LinkedList<>();
        a = cr;
        if (cr % 6 == 0) {
            d = 6;
        } else if (cr % 4 == 0) {
            d = 4;
        } else {
            return null;
        }
        do {
            b = a / d;
            c = page / a;
            if (cr % b == 0) {
                for (int i = 0; i < c; i++) {
                    list1.add(a);
                }
                page = page - a * c;
            }
            a = (b - 1) * d;

        } while (page > 0);
        Collections.reverse(list1);
        List<Page> pageList = new ArrayList<>();
        Page pageObj = null;
        List<Integer> list2 = null;
        int multiple, f;
        int start = 1, end = e;
        boolean flag = false;
        for (int i : list1) {
            list2 = new ArrayList<>();
            pageObj = new Page();
            multiple = cr / i;
            if (i < cr) {
                f = i / 2;
                for (int j = 0; j < f; j++) {
                    list2.add(start + j);
                }
                for (int j = f; j > 0; j--) {
                    list2.add(end - j + 1);
                }
                start = start + f;
                end = end - f;
            } else {
                for (Page page1 : pageList) {
                    if (page1.getMultiple() == 1) {
                        flag = true;
                        list2 = page1.getPages();
                        break;
                    }
                }
                for (int j = 0; j < cr; j++) {
                    list2.add(start + j);
                }
                start = start + cr;
            }
            if (!flag) {
                pageObj.setPages(list2);
                pageObj.setMultiple(multiple);
                pageList.add(pageObj);
            }
        }
        return pageList;
    }

}
